home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tiger Disk 54
/
Tiger_Disk_054_1998-09_Tiger-Crew-Disk_de_Side_B.d64
/
befehle.sda
/
6502-ERGAENZUNG
< prev
next >
Wrap
Text File
|
2023-02-26
|
5KB
|
106 lines
ADRESSIERUNGSARTEN
PROZESSOR 6502 / 6510: 56 BEFEHLE, 13 ADRESSIERUNGSARTEN
IMM.: IMMEDIATE (UNMITTELBAR): OPERAND = BEFEHLSBYTE; Z.B. LDA #$01
ABS.: ABSOLUTE (DIREKT): ANGABE DER 2-BYTE-ADRESSE DES OPERANDEN; Z.B.: LDA $F
E00
Z: ZEROPAGE (ABSOLUTE 1-BYTE-ADRESSE); 1-BYTE-ADRESSE ZEIGT AUF OPERAND IN ZE
ROPAGE; Z.B. LDA $FE
IND.: INDIRECT; ANGEGEBENE ADRESSE ZEIGT AUF ADRESSE DES OPERANDEN; NUR: JMP; Z.
B. JMP ($FFFC)
A: ACCUMULATOR; BEFEHL WIRKT AUF AKKU; Z.B. ASL A BZW. NUR ASL
IMP.: IMPLIED (IMPLIZIERT); BEFEHL ENTHAELT ADRESSIERUNG; ZB. CLD
REL.: RELATIVE; ZUM MOMENTANEN STAND DES PROGRAMCOUNTERS WIRD DIE SPRUNGWEITE IM
BEREICH -128..+127 IM ZWEIERKOMPLEMENT
ALSO $80(=-128)..$FF(=-1)..$01(=+1)..$7F(=+127) ANGEGEBEN; IM ASSEMBLER WI
RD ABER DIREKT DAS ZIEL ANGEGEBEN:
Z.B: BNE $2013 OD. BNE LOOP
Z,X: INDEXED, X ADRESSING; Z.B. LDA $AB,X: LAEDT AKKU MIT BYTE DER ADRESSE $AB+
X
Z,Y: INDEXED, Y ADRESSING
ABS,X INDEXED, X ADRESSING; Z.B. LDA $1800,X
ABS,Y INDEXED, Y ADRESSING
(IND,X): INDEXED INDIRECT, X ADRESSING; IND STELLT STETS EINE ZEROPAGEADRESSE DA
R.
BEFEHLSADRESSE STEHT IN DEN ZELLEN IND+X (LOW-BYTE) / IND+X+1 (HI-BYTE)
(IND),Y: INDIRECT INDEXED, Y ADRESSING; IND STELLT ZEROPAGE-ADRESSE DAR.
BEFEHLSADRESSE: ZELLEN IND/IND+1 AUSLESEN UND ZU DIESER ADRESSE Y ADDIEREN
BEISPIELE: INHALT DER ZELLEN: X=$04 Y=$05 $23=0 $24=$18 $27=$00 $28=$91
LDA ($23,X): HOLT BYTE AUS $9100 IN DEN AKKU
LDA ($23),Y: HOLT BYTE AUS $1805 IN DEN AKKU
RECHNEN:
ADC UND SBC: OVERFLOW-FLAG V WIRD GESETZT WENN:
A) UEBERTRAG VON BIT 6 AUF BIT 7 OHNE AEUSSEREN UEBERTRAG (CARRY)
B) AEUSSERER UEBERTRAG BIT 7 INS CARRY-BIT OHNE UEBERTRAG BIT 6 AUF 7
ADC: ZUM AKKU WIRD ARGUMENT PLUS CARRY ADDIERT
SBC: A = A MINUS ARGUMENT MINUS INVERTIERTES CARRY-BIT ("BORROW"). WIE BEIM HAND
SCHRIFTLICHEN RECHNEN WIRD BEIM
ERGEBNIS C=0, WENN EIN "BORROW"-UEBERTRAG AUF DIE NAECHSTE STELLE AUFTRITT.
DEZIMALFLAG: MIT SED WIRD DEZIMALMODUS EINGESCHALTET: RECHNEN MIT BCD-CODES (DEZ
. 00..99 ENTSPRICHT HEX. 00..99)
WIRKT AUF ADC UND SBC. DABEI IST BEI ADC DIE ZERO-FLAG UNGUELTIG!
BEFEHL: SBC #$66 (CMP-BEFEHL: SELBE WIRKUNG AUF N,Z,C WIE SBC MIT C=1)
VORHER: A=65 C=1 NACHHER: A=FF C=0 N=1 ("BORROW" ERFOLGT: C GELOESCHT)
A=66 C=1 A=00 C=1 Z=1
A=67 C=1 A=01 C=1
A=65 C=0 A=FE C=0 N=1 ("BORROW" WIRD ABGEZOGEN)
A=66 C=0 A=FF C=0 N=1
A=67 C=0 A=00 C=1 Z=1
VERSCHIEDENES
FLAGREGISTER: FLAGS: N V 1 B D I Z C
VEKTOREN: IRQ (UND BRK): FFFE/FFFF; RESET: FFFC/FFFD; NMI: FFFA/FFFB
STACKPOINTER S: BEIM ABLEGEN VON DATEN AUF DEN STACK ($100-$1FF) WIRD VON OBEN (
$1FF) NACH UNTEN GESTAPELT
UND S DEKREMENTIERT; S ZEIGT AUF EINEN FREIEN PLATZ.
JSR: PROGRAMMZAEHLER WIRD AUF STACK GELEGT: ERST PCH, DANN PCL. DABEI ZEIGT PC A
UF DAS LETZTE DER 3 BEFEHLSBYTES.
RTS: DER PROGRAMMZAEHLER WIRD VOM STACK GEHOLT UND UM 1 ERHOEHT (DAMIT ZEIGT ER
AUFS ERSTE BYTE DES FOLGEBEFEHLS)
INTERRUPTS: AKTUELLER BEFEHL WIRD (INCLUSIVE ALLER OPERATIONSTEILE) BEENDET; DAN
N WIRD PCH, PCL UND P AUF STACK
GEGEBEN (P: FLAGREGISTER). ANDERE REGISTER WERDEN NICHT AUTOMATISCH GERETTET.
DIE INTERRUPTFLAG IST IM AKTUELLEN P GESETZT, NICHT IN P AUF DEM STACK. BEI DER
BREAK-FLAG IST ES UMGEKEHRT.
VORSCHLAG FUER INTERRUPTPRG.: PHA TXA PHA TYA PHA .... PLA TAY PLA TAX PLA RTI.
NACH RTI WIRD DAS PROGRAMM NACH IRQ BZW. NMI PROBLEMLOS FORTGESETZT, NICHT JEDOC
H NACH DEM SOFTWAREINTERRUPT BRK:
DER PROGRAMMZAEHLER MUSS UM 1 VERMINDERT WERDEN!
UNTERSCHEIDUNG ZWISCHEN BRK UND IRQ (SELBER HARDWAREVEKTOR!): S. KERNAL AB $FF48
:
PHA TXA PHA TYA PHA TSX (STACKPOINTER LESEN) LDA $0104,X (FLAGREGISTER IM
STACK LESEN) AND #$10
BEQ $FF58 (BREAK-FLAG NICHT GESETZT) FF55: JMP ($0316) (BREAK-ROUTINE) FF58: J
MP ($0314) (IRQ-ROUTINE).
BEISPIEL: BRK-BEFEHL AN DER STELLE $9112, ANWENDUNG OBIGER ROUTINE ZUM RETTEN DE
R REGISTER: IM STACK STEHT VON OBEN
NACH UNTEN: $91 $14 P A X Y (P: B=1). NACH RTI WIRD AN $9114 STATT AN $9113 WEI
TERGEMACHT!
PROZESSORFEHLER: BEI INDIREKTEM JUMP MIT $FF ALS LOWBYTE DER ADRESSE GIBT ES EIN
EN FEHLER: Z.B.: JMP ($18FF); SPRUNGADRESSE WIRD NICHT IN $18FF/$1900 SONDERN IN
$18FF/$1800 GEHOLT.
TESTEN: MIT SMON RAM ZWISCHEN $1000 UND $3000 MIT 00 FUELLEN (BRK!), DANN "A 200
0" "JMP ($18FF)"
MIT "M"-BEFEHL $80 IN $1800, $90 IN $1900 GEBEN; DANN "G 2000" EINGEBEN.
SMON MELDET SICH WIEDER MIT PC=$8001 STATT $9001!
SOFTWARE(IN)KOMPATIBILITAET:
DER 6510 ENTHAELT EINEN E/A-PORT IN DEN ADRESSEN 0 UND 1. DIESE SIND SOMIT NICHT
ALS "NORMALE" ZELLEN VERWENDBAR.
DER 6502 HAT EINEN HARDWAREEINGANG ZUM SETZEN DES "V"-FLAGS, WAS Z.B. IN DER FLO
PPY 1541 AUSGENUTZT WIRD.
DER 65SC02 (C-MOS-VARIANTE) HAT EINEN ERWEITERTEN BEFEHLSSATZ. ALLE "ILLEGALEN"
BEFEHLE SIND ENTFERNT WORDEN.
DER 65(S)C816 (16 BIT) IST AUFWAERTSKOMPATIBEL ZUM 6510 (6/8 PORTBITS); "ILLEGAL
E" BEFEHLE SIND ERSETZT WORDEN.